#include <linux/semaphore.h>
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("GPL");

static int __init down_interruptible_init(void);
static void __exit down_interruptible_exit(void);

struct semaphore sema;

int __init down_interruptible_init(void)
{
	int ret;

	printk("---------------------\n [%s] eneter! \n",__func__);

	sema_init( &sema, 5 );                //信号量初始化
	
	/* 输出初始化后信号量的信息 */
	printk("after sema_init, sema.count: %d\n", sema.count);

	// - 5

	ret = down_interruptible( &sema);     //获取信号量
	
	/* 输出down_interruptible操作后信号量的信息 */
	printk("first down_interruptible, ret = %d\n", ret);    //输出返回值
	
	// 0
		
	// 输出信号量sema的自旋锁字段的值
	printk("first down_interruptible, sema.count: %d\n", sema.count);
	
	// 4 
	

	// 输出信号量计数器值
	sema_init( &sema, 0 );
	
	ret = down_interruptible( &sema);
	printk("second down_interruptible, ret = %d\n", ret);
	printk("second down_interruptible, sema.count: %d\n", sema.count);
	
	return 0;
}


void __exit down_interruptible_exit(void)
{
	printk("[%s] exit! \n",__func__);
}

module_init(down_interruptible_init);
module_exit(down_interruptible_exit);



/*****************************
 *
 *


down_interruptible()函数用来获取信号量，将信号量sem的计数器值减1，
但它是可被信号中断的，这一点与down()函数不同。
当有另外的内核控制路径给这个因为竞争不到信号量而睡眠的进程发送了一个信号时，它收到信号后就会立即返回，而放弃继续获得信号量。




*******************************/

